package com.lin.gulimall.seckill.scheduled;


import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;


/*
* 定时任务
*   1、@EnableScheduling 开启定时任务
*   2、@Scheduled 开启一个定时任务
*   3、自动配置类 TaskSchedulingAutoConfiguration
* 异步任务
*   1、@EnableAsync 开启异步任务功能
*   2、@Async 给希望异步执行的方法上标注注解
*   3、自动配置类 TaskExecutionAutoConfiguration 属性绑定在TaskExecutionProperties
*   task.execution.pool.core-size: 5
*   task.execution.pool.max-size: 50
*/

@Slf4j
@Component    //使用这个放入容器中
//@EnableAsync   在ScheduledConfig中编写了，这里就不用编写了。
//@EnableScheduling
public class HelloScheduule {

    /*
    * 1、@Scheduled(cron = "* * * * * ? 2021")报错，因为spring不支持年
    * Encountered invalid @Scheduled method 'hello': Cron expression must consist of 6 fields (found 7 in "* * * * * ? 2021")
    * 2、@Scheduled(cron = "* * * ? * 1")在java中1-7代表周一到周日
    * 3、定时任务不应该阻塞。默认是阻塞的。
    *   1)、可以让业务运行以异步的方式，自己提交到线程池
    *  CompletableFuture.runAsync(()->{
    *        xxxxService.hello();
    *            },executor);
    *   2)、定时任务线程池:设置TaskSchedulingProperties  (由于是绑定在配置文件中，直接去改配置文件)
    *       task.scheduling.pool.size: 5   (没用)
    *
    *   3)、让定时任务异步执行。
    *       异步任务:
    *
    *   解决:使用异步+定时任务来完成定时任务不阻塞的功能
    *
    */

    //@Async
    //@Scheduled(cron = "* * * ? * 1")
    public void hello() throws InterruptedException {
        log.info("hello...");
        Thread.sleep(3000);
    }
}
